package com.aust.lambda;

import java.util.function.Function;

public class TestLambda10 {

    /**
     * 泛型方法
     * 函数式接口Function<T, R>
     * 方法内部调用函数式接口中的方法
     * 方法外部实现函数式接口中的方法
     * 逻辑步骤：
     * 1.调用process方法
     * 2.实现process方法中的参数：函数式接口Function<T, R>
     * 3.在process方法中调用函数式接口实现的方法（回调方法）
     *
     * @param input
     * @param processor
     * @param <T>
     * @param <R>
     * @return
     */
    public static <T, R> R process(T input, Function<T, R> processor) {
        return processor.apply(input);
    }

    /**
     * 回调的核心概念是：
     * 将一段代码作为参数传递
     * 在适当的时候由接收方调用这段代码
     * 实现控制反转（调用方决定何时执行，而不是被调用方）
     *
     * @param args
     */
    public static void main(String[] args) {

        /**
         * 匿名内部类
         * lambda表达式
         * 方法引用
         */
        /**
         * 使用方法1：字符串长度
         */
        Integer i = process("Hello World", new Function<String, Integer>() {
            @Override
            public Integer apply(String string) {
                return string.length();
            }
        });
        System.out.println(i);

        /**
         * 使用方法2：字符串转大写
         */
        String s = process("Hello World", new Function<String, String>() {
            @Override
            public String apply(String string) {
                return string.toUpperCase();
            }
        });
        System.out.println(s);

        /**
         * 使用方法3：自定义转换
         */
        String string = process("Hello World", new Function<String, String>() {
            @Override
            public String apply(String string) {
                return string + "!";
            }
        });
        System.out.println(string);

    }

}
